package IHM;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledEditorKit;

import org.jdom.Element;

import Metier.Paragraphe;

/**
 * Classe gerant de la toolbar lors de la modification d'un paragraphe
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */
public class ToolBarModif extends JPanel implements ActionListener{

	/**
	 * Barre d'outils contenant les differents boutons de mise en forme lors d'une modification
	 */
	private JToolBar toolbar;
	
	/**
	 * Bouton permetant l'alignement à gauche du texte
	 */
	private JButton btn_align_left;
	
	/**
	 * Bouton permetant l'alignement au centre du texte
	 */
	private JButton btn_align_center;
	
	/**
	 * Bouton permetant l'alignement à droite du texte
	 */
	private JButton btn_align_right;
	
	/**
	 * Bouton permetant l'alignement justifié du texte
	 */
	private JButton btn_align_justified;
	
	/**
	 * Bouton permetant la mise en gras du texte
	 * @see ToolBarModif#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_gras;
	
	/**
	 * Bouton permetant la mise en italique du texte
	 * @see ToolBarModif#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_italique;
	
	/**
	 * Bouton permetant le soulignage du texte
	 * @see ToolBarModif#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_souligne;
	
	/**
	 * Bouton permetant de barré du texte
	 * @see ToolBarModif#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_barre;
	
	/**
	 * Bouton permetant de valider la modification
	 */
	private JButton btn_modif;
	
	/**
	 * Bouton permetant d'annuler la modification
	 */
	private JButton btn_annul;
	
	/**
	 * L'instance de la ZoneTexte de l'application, permetant de faire le lien entre les boutons et la zone de saisie
	 */
	private ZoneTexte text;
	
	/**
	 * L'instance de l'IHM de l'application
	 */
	private IHM ihm;
	
	/**
	 * l'instance de l'element à modifier
	 * @see ToolBarModif#setElement(Element)
	 */
	private Element elem;
	
	/***
	 * Constructeur de la classe ToolBarModif
	 * @param ihm	l'instance de l'IHM
	 * @param texte	l'instance de la ZoneTexte
	 */
	public ToolBarModif(IHM ihm, ZoneTexte texte){
		
		/* creation de la toolbar */
		this.ihm = ihm;
		this.text = texte;
		toolbar = new JToolBar();
		toolbar.setFloatable(false);
		
		JLabel lab=new JLabel("Modification de paragraphe : ");
		toolbar.add(lab);
		
		/* Misee en forme */
		/* Alignement */
		/* Gauche */
		btn_align_left = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_LEFT)); // creer le bouton
		btn_align_left.setToolTipText("alignement à gauche"); // Definie l'intitule du bouton
		btn_align_left.setIcon(new ImageIcon(getClass().getResource("/images/align_left.png"))); // ajoute une icone sur le bouton
		btn_align_left.addActionListener(this);
		toolbar.add(btn_align_left); // ajoute le bouton
		
		/* centrer */
		btn_align_center = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_CENTER));
		btn_align_center.setToolTipText("alignement centrer");
		btn_align_center.setIcon(new ImageIcon(getClass().getResource("/images/align_center.png")));
		btn_align_center.addActionListener(this);
		toolbar.add(btn_align_center);
		
		/* Droite */
		btn_align_right = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_RIGHT));
		btn_align_right.setToolTipText("alignement à droite");
		btn_align_right.setIcon(new ImageIcon(getClass().getResource("/images/align_right.png")));
		btn_align_right.addActionListener(this);
		toolbar.add(btn_align_right);
		
		/* Justifi� */
		btn_align_justified = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_JUSTIFIED));
		btn_align_justified.setToolTipText("alignement justifié");
		btn_align_justified.setIcon(new ImageIcon(getClass().getResource("/images/align_justified.png")));
		btn_align_justified.addActionListener(this);
		toolbar.add(btn_align_justified);

		toolbar.addSeparator();

		/* Mise en forme ( Gras / italique / soulign� / barr� ) */
		/* Gras */
		btn_gras = new JToggleButton(new StyledEditorKit.BoldAction());
		btn_gras.setText("");
		btn_gras.setToolTipText("Gras");
		btn_gras.setIcon(new ImageIcon(getClass().getResource("/images/gras.png")));
		btn_gras.addActionListener(this);
		toolbar.add(btn_gras);
		/* italique */
		btn_italique = new JToggleButton(new StyledEditorKit.ItalicAction());
		btn_italique.setText("");
		btn_italique.setToolTipText("Italique");
		btn_italique.setIcon(new ImageIcon(getClass().getResource("/images/italique.png")));
		btn_italique.addActionListener(this);
		toolbar.add(btn_italique);
		/* soulign� */
		btn_souligne = new JToggleButton(new StyledEditorKit.UnderlineAction());
		btn_souligne.setText("");
		btn_souligne.setToolTipText("Souligné");
		btn_souligne.setIcon(new ImageIcon(getClass().getResource("/images/souligne.png")));
		btn_souligne.addActionListener(this);
		toolbar.add(btn_souligne);
		/* barr� */
		btn_barre = new JToggleButton(new StrikeThroughAction());
		btn_barre.setToolTipText("Barré");
		btn_barre.setIcon(new ImageIcon(getClass().getResource("/images/barre.png")));
		btn_barre.addActionListener(this);
		toolbar.add(btn_barre);

		toolbar.addSeparator();

		/* Ajout du Bouton ajout */
		btn_modif = new JButton("Modifier");
		btn_modif.setToolTipText("Modifier le paragraphe");
		btn_modif.addActionListener(this);
		toolbar.add(btn_modif);
		
		toolbar.addSeparator();
		
		/* Ajout du Bouton annule */
		btn_annul = new JButton("Annuler");
		btn_annul.setToolTipText("Annuler la modification");
		btn_annul.addActionListener(this);
		toolbar.add(btn_annul);
		
		//toolbar visible et mise en place
		add(toolbar);
		setVisible(true);
	}
	
	/**
	 * Permet de modifier l'element a modifier
	 * @param e	Element a modifier
	 */
	public void setElement(Element e){
		elem=e;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource()==btn_modif){
			elem.removeContent();//supprime tout ce que contient le paragraphe avant modification
			
			Paragraphe p=(Paragraphe)elem;
			p.modifier(SerialClone.clone(ihm.getZoneTexte().getJTextPane().getStyledDocument()));
			
			ihm.setToolBar();//remet la toolbar de base
			ihm.majVisu();   //met a jour le visu
			elem=null;		 //vide l'element par sécurité
			ihm.getArborescence().requestFocus();
		}
		if(e.getSource()==btn_annul){
			ihm.setToolBar();//remet la toolbar de base
			ihm.majVisu();   //met a jour le visu
			elem=null;		 //vide l'element par sécurité
			ihm.getArborescence().requestFocus();
		}
		else if(e.getSource()==btn_gras || e.getSource()==btn_italique || e.getSource()== btn_souligne || e.getSource()==btn_barre ||
				e.getSource()==btn_align_center || e.getSource()==btn_align_justified || e.getSource()==btn_align_left || e.getSource()==btn_align_right){
			text.getJTextPane().requestFocus();
		}
	}
	
	/**
	 * Permet de mettre a jour la position des boutons de mise en forme
	 * @param gras		vrai(true) si texte en gras
	 * @param italique	vrai(true) si texte en italique
	 * @param souligne	vrai(true) si texte en souligne
	 * @param barre		vrai(true) si texte en barre
	 */
	public void setToggle(boolean gras,boolean italique,boolean souligne,boolean barre){
		btn_gras.setSelected(gras);
		btn_italique.setSelected(italique);
		btn_souligne.setSelected(souligne);
		btn_barre.setSelected(barre);
	}

}
